package org.example.demo.Controller;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

/**
 * 文件上传控制器类，使用@RestController定义，表明该类所有的方法返回的数据都将直接写入HTTP响应体。
 * 并通过@RequestMapping设置请求路径"/file"，映射后续方法到该路径。
 */
@RestController
@RequestMapping("/file")
public class FileUploadController {

    /**
     * 用于存放上传文件的路径。通过@Value注解从配置文件中读取配置项"file.upload-path"获取。
     * 该配置项应先在application.properties或application.yml中定义，以指定文件上传的存储位置。
     */
    @Value("${file.upload-path}")
    private String uploadPath;

    /**
     * 为"/file/upload"路径映射一个处理HTTP POST请求的方法，用于处理文件上传。
     * 方法通过参数uploadFile接收上传的文件，该参数利用Spring的MultipartFile接口封装了上传的文件。
     * 方法通过参数request获取当前的HttpServletRequest对象，主要用于获取路径信息等。
     *
     * @param uploadFile MultipartFile对象，封装了上传的文件内容。
     * @param request    当前的HttpServletRequest对象，用于获取请求上下文信息。
     * @return 返回"SUCCESS"字符串表示上传成功，或者返回"NULL FILE"字符串表示未收到文件。
     */
    @RequestMapping("/upload")
    public String upload(@RequestParam("uploadFile") MultipartFile uploadFile, HttpServletRequest request) {
        // 首先检查上传的文件是否为空或者未定义
        if (uploadFile == null || uploadFile.isEmpty()) {
            return "NULL FILE";
        }

        // 获取上传目标文件夹的绝对路径（也可以是本地路径）
        String realpath = uploadPath;

        // 打印实际目录观察路径是否正确
        System.out.println("path:" + realpath);

        // 创建File对象，用于表示目标目录
        File parenDir = new File(realpath);

        // 判断指定的目标目录是否存在，如果不存在则创建它
        if (!parenDir.exists()) {
            System.out.println("目录不存在，创建中...");
            parenDir.mkdirs();
        }

        // 通过上传的MultipartFile获取上传文件的原始文件名
        String fileName = uploadFile.getOriginalFilename();
        System.out.println("fileName: " + fileName);

        // 如果上传时没有文件名（空字符串），则默认使用字符串"default"作为文件名
        if (fileName == null) {
            fileName = "default";
        }

        // 创建上传文件的目标File对象
        File target = new File(parenDir, fileName);

        // 开始保存文件到目标位置
        try {
            uploadFile.transferTo(target);
        } catch (IOException e) {
            // 如果保存失败，打印堆栈跟踪信息，告知错误信息
            e.printStackTrace();
            return "SAVE FAILED";
        }

        // 文件保存成功，返回"SUCCESS"给客户端
        return "SUCCESS";
    }

    @RequestMapping("/uploads")
    public String uploads(@RequestParam("uploadFiles") MultipartFile[] uploadFiles, HttpServletRequest request) {
        // TODO: 实现文件批量上传的逻辑
        System.out.println("uploadFiles: " + Arrays.toString(uploadFiles));
        if (uploadFiles == null || uploadFiles.length == 0) {
            return "NULL FILE";
        }
        // 获取上传
        String realpath = uploadPath;
        // 创建为File对象目录
        File parenDir = new File(realpath);
        // 判断目录是否存在，如果不存在则创建
        if (!parenDir.exists()) {
            System.out.println("目录不存在，创建中...");
            if (!parenDir.mkdirs()) {
                System.out.println("目录创建失败");
                return "DIRECTORY_CREATE_FAILED";
            }
        }
        System.out.println("path:" + realpath);
        // 循环上传
        for (MultipartFile uploadFile : uploadFiles) {
            // 获取上传的文件名
            String fileName = uploadFile.getOriginalFilename();
            System.out.println("fileName: " + fileName);
            if (fileName == null) {
                fileName = "default";
            }
            // 创建目标文件对象
            File target = new File(parenDir, fileName);
            try {
                uploadFile.transferTo(target);
                System.out.println("保存成功, 文件名：" + fileName);
            } catch (IOException e) {
                e.printStackTrace();
                return "SAVE FAILED";
            }
        }
        return "SUCCESS";
    }
}
